Low-level/Atypical Technology Fundamentals
- A guide I made for a friend on learning basic low-level CS -
This is a probably overwhelming dump of general info and resources to get you started with learning about “technology” on a lower level. You will have to do most of the research, this is just a general guideline/path that is non-comprehensive and not particularly well-organized. You might know some of this already so just skip those parts.
- To start: learning to learn efficiently and effectively tends to be useful. Everyone has their own way but my advice is to take notes and apply whatever you learn when possible
- Know how your OS works (for specifics: Linux is easier to learn than Windows - for Windows there’s a Windows Internals book somewhere, Linux has great docs at tldp and the arch, gentoo, and slackware wikis are also useful for less kernel- and more userspace- specific information). For more general articles (microkernel vs hybrid vs monolithic for example), visit the osdev wiki and go link hopping
- Finish installing Linux
- Interact with the community
- inputs: hackernews, slashdot, other tech news (arstech, theverge, bleeping computer)
- outputs: chatrooms, discord servers, forums, make some friends, make some foss software, write blog posts
- You’re going to run into issues - linuxquestions is a good forum for LFS, the unix stackexchange is good for asking other people to make you bash scripts (lol), stackexchange in general is great as a resource (not so much as a company and their moderation is questionable once you get in deep enough), and just talk to people that know more than you if possible
- Learn basic infosec. It teaches you a lot about backend and is downright fascinating. In your case, reversing (you can learn via a course called Nightmare) will be useful, but knowing what a CVE is, how to fuzz (very interesting idea and worth learning), and basic pentesting/rooting automated tools will probably come in handy at some point
- Maybe get a mech keyboard. Just as an idea … get sucked in and become one of us (check out the r/mechanicalkeyboards wiki)
- If you’re working with AI (even if not AGI), make sure to sit down and form an opinion on the ethics and philosophy of what you’re doing (lesswrong has articles on the topic)
- I’ve heard good things about nand2tetris, it’s probably a faster way of doing what I did (I dealt directly with building a toy bootloader and writing/reading asm, learned a lot through the osdev wiki, but the information I absorbed was unstructured so … go the book way). But if you learn asm pursely with that, at least know the differences between ARM and x86 and intel vs AT&T syntax (azeria-labs has a good cheatsheet on ARM syntax; it’s RISC and easy to learn)
- Speaking of books: read and implement Crafting Interpreters! It teaches you how interpreted langs work underneath by guiding you in building one (also provides instructions on a bytecode VM). And/or learn LISP, it’s basically an AST (abstract syntax tree) and is the mother of all programming languages (exaggeration but many popular langs are inspired by it in some way or another)
- Distributed systems are interesting as a curiosity - learn how DHTs work (see the kademlia/pastry specs), build a toy blockchain in python in like 20 mins (locally, so you’re just hashing blocks to get the idea)
- Learn basic hardware info - Linus Tech Tips is your friend, binge the videos; they’re entertaining
- For sliiightly more industrial hardware look at r/homelab’s wiki (reddit has a lot of amazing wikis on various generally non-technical concepts - r/onion insanely useful as is that of r/truerateme). For even more industrial hardware IBM and Dell have server specs available and various conferences that get into even more detail
- Networking tends to be useful - I found this to be a phenomenal resource but it’s a bit long as a series and the end videos are unnecessary if you just want a basic overview. NetworkChuck makes really nice videos too, you can just watch his “CCNA prep” vids and be satiated
- A liiiittle bit of electrical engineering goes a long way. Know what a transistor, resistor, inductor, capacitor, diode, are, know the physics of electromagnetism (here is a good summary of physics as a whole in case you want a good reference to refresh your memory), etc
- Learn how a CPU works down to the mosfet and also maybe read about PCBs - this is a 4-part in-depth tutorial on how to make a keyboard PCB from scratch.
- Playing with logic gates is also interesting; Ben Eater makes fascinating videos on low-level design (built an 8-bit computer from scratch)
- As for FOSS contribution - hacktober is good because people tag easy issues as such, and in general just look for ‘good-first-issue’ to start. Set up a local git env (and learn to use the CLI - this has the basic commands, look up everything else). Also learn how git works as a VCS, there are a few ‘build your own git’ tutorials out there
- “build your own [anything]” tends to teach you a lot - here’s an awesome resource list
- Many large projects use mailing lists to coordinate. Learn how those work with torproject or eternal-september (which is usenet articles)
- Start writing bash and python scripts to automate tasks that seem tedious or repetitive
- On a higher, less technical level - learn how to ask questions and how to contact people. Even “famous” individuals will sometimes answer questions if they are specific to that person’s expertise - just be polite, humble, and contact them, it’s always worth a shot. Also, work with some people on software (open-source or small group of friends) and deal with the difficulties you run into there (organization of tasks, merge conflicts, etc)
- The Programmer’s Handbook is an amazing overview of competition programming
- Casually watch the newest hardware developments, specifically in computing (know the difference between efficiency and performance cores (and AI cores, those are cool), know what an FPU/APU is, know advantages of GPU-style parallel computing over CPU general computing and vice versa, know the power draw of various devices,know about the specs of the latest NVME/PCIe version, DDR5 cas latency and bandwidth, how computing “fabrics” work, smartNICs because those are apparently a thing now, etc. You’ll find this info by looking further into the things mentioned in LTT videos and by reading tech news (check out eetimes for more technical info))
- Always be wary of everything (for example, self-driving cars (and a large boat, at some point) were effectively hacked through GPS spoofing, and Shodan (interent-connected-devices search engine) shows a lot of publicly vulnerable webcams. There are also undoubtedly unavoidable and undiscovered vulnerabilities similar to Spectre (and general side channel attacks) and Heartbleed, and so many supply chain attacks. Everything is compromised.
- Learn a bit about crypto (‘crypto means cryptography’ is a refrain among many technical individuals as most are rather negatively disposed to cryptocurrency believing it to be basically vaporware). iAnyway, learn about RSA and PKI in general, know how AES works (here’s a comic that explains it pretty well), know about NTRU and general post-quantum ciphers (and Shor’s algorithm - also quantum computing as a whole is interesting - learn how it works low level, error-correcting methods, IBM has a cloud quantum computer available via qiskit)
Software recommendations:
Perhaps get in the habit of using vim (or neovim)
Use a tiling window manager such as i3 or sway. You will never want to go back
bookmarklet for speeding up videos: javascript:document.getElementsByClassName("video-stream")[0].playbackRate = '2.75'; void(0)
Below is various mostly FOSS software that I would recommend using if you have a usecase for it. These are just things I’ve been using for a while and have enjoyed, not necessarily the best options out there so take this with a grain of salt.
Typical stuff: VScode, GIMP, VLC, exiftools
(removes exifdata - always do this before posting pictures as many phones add geolocation data), wireshark (packet sniffer - learn to use this), thunderbird, some sort of rss reader, keepassxc (use. a. password. manager. the earlier you start the better), gpg (send me your public key! Here’s a guide on getting one), some sort of clipboard history manager (I personally can’t live without this but depends on your workflow), learn docker (there’s a video on implementing it in golang on docker’s main website, if you speed through it you should get the gist of containerization), degoogled chromium and tor-browser-bundle are good browsers (Use Ublock Origin, huge QOL improvement), valgrind
for detecting memleaks in C/C++, nmap
for network-mapping (run it with some scripts to pentest your own net), zsh over bash (I can give you my dots), for shell: dust
to replace du
, broot
to replace tree
, bat
to replace cat
, flameshot for screenshots